// ThreadPoolConfig.java
package com.sywl.ytcx.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 线程池配置类
 * <p>
 * 创建和管理应用所需的各类线程池
 */
@Configuration
public class ThreadPoolConfig {

    /**
     * 自定义线程工厂，用于设置线程名称前缀和非守护状态
     */
    private static class NamedThreadFactory implements ThreadFactory {
        private final String prefix;
        private final AtomicInteger counter = new AtomicInteger(0);

        NamedThreadFactory(String prefix) {
            this.prefix = prefix;
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r, prefix + "-" + counter.incrementAndGet());
            // 设置为非守护线程，确保 JVM 正常运行
            t.setDaemon(false);
            return t;
        }
    }

    /**
     * 用户内容查询线程池（CPU 密集型任务）
     * <p>
     * 建议核心线程数 = CPU 核心数 + 1，以充分利用处理能力。
     * 最大线程数 = CPU 核心数 * 2，以应对短暂的并发高峰。
     *
     * @return 配置好的 ThreadPoolExecutor 实例
     */
    @Bean("userContentExecutor")
    public ThreadPoolExecutor userContentExecutor() {
        int cpuCount = Runtime.getRuntime().availableProcessors();
        int corePoolSize = cpuCount + 1;           // 核心线程 = CPU 核心数
        int maxPoolSize = cpuCount * 2;        // 最大线程 = CPU 核心数 * 2
        long keepAliveTime = 60L;              // 空闲线程存活时间（秒）
        BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(200);  // 阻塞队列长度
        ThreadFactory factory = new NamedThreadFactory("uc-pool");     // 自定义线程工厂
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();  // 饱和策略：调用者线程执行

        ThreadPoolExecutor exec = new ThreadPoolExecutor(
                corePoolSize, maxPoolSize,
                keepAliveTime, TimeUnit.SECONDS,
                queue, factory, handler
        );
        // 预启动所有核心线程
        exec.prestartAllCoreThreads();
        return exec;
    }

    
}
